"auto";
app.launchApp("快手")
console.show();
// // console.log("调整大小...");
// // console.setSize(300, 300);
// // sleep(1000);
// console.log("调整位置...");
// console.setPosition(0, 200);
// sleep(1000);

是否root = false;

/////////////////////////////////////////////////////////////////////////////////////

/**
 * 随机位置点
 * @param {起始值} start 
 * @param {结束值} end 
 * @returns 
 */
function randomPointLoc(start, end) {
    len = end - start;
    loc = Math.floor(Math.random() * len) + start;
    return loc;
}

/**
 * 从几秒到几秒
 * @param {开始秒} start 
 * @param {结束秒} end 
 * @returns
 */
function randomRangeTime(start, end) {
    len = (end - start) * 1000;
    ms = Math.floor(Math.random() * len) + start * 1000;
    return ms;
}


/**
 * 秒转毫秒 
 * @param {秒} sec 
 * @returns 
 */
function secToMs(sec) {
    return sec * 1000;
}

/**
 * 仿真随机带曲线滑动 
 * @param {起点x} qx 
 * @param {起点y} qy 
 * @param {终点x} zx 
 * @param {终点y} zy 
 * @param {滑动时间，单位毫秒} time 
 */
function sml_move(qx, qy, zx, zy, time) {
    var xxy = [time];
    var point = [];
    var dx0 = {
        "x": qx,
        "y": qy
    };

    var dx1 = {
        "x": random(qx - 100, qx + 100),
        "y": random(qy, qy + 50)
    };
    var dx2 = {
        "x": random(zx - 100, zx + 100),
        "y": random(zy, zy + 50),
    };
    var dx3 = {
        "x": zx,
        "y": zy
    };
    for (var i = 0; i < 4; i++) {

        eval("point.push(dx" + i + ")");

    };
    // log(point[3].x)

    for (let i = 0; i < 1; i += 0.08) {
        xxyy = [parseInt(bezier_curves(point, i).x), parseInt(bezier_curves(point, i).y)]

        xxy.push(xxyy);

    }

    // log(xxy);
    gesture.apply(null, xxy);
}

function bezier_curves(cp, t) {
    cx = 3.0 * (cp[1].x - cp[0].x);
    bx = 3.0 * (cp[2].x - cp[1].x) - cx;
    ax = cp[3].x - cp[0].x - cx - bx;
    cy = 3.0 * (cp[1].y - cp[0].y);
    by = 3.0 * (cp[2].y - cp[1].y) - cy;
    ay = cp[3].y - cp[0].y - cy - by;

    tSquared = t * t;
    tCubed = tSquared * t;
    result = {
        "x": 0,
        "y": 0
    };
    result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
    result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
    return result;
};

/**
 * 从下往上滑动，随机坐标
 */
function slidingByLine() {
    // top X,Y范围
    tx = randomPointLoc(500, 600);
    ty = randomPointLoc(300, 400);
    // bottom X，Y 范围
    bx = randomPointLoc(400, 700);
    by = randomPointLoc(1880, 2000);

    log("sliding (" + bx + "," + by + "), (" + tx + "," + ty + ")")
    log("X: " + Math.abs(bx - tx) + " Y: " + Math.abs(by - ty));
    slidingTime = randomRangeTime(0.8, 1.3);
    swipe(bx, by, tx, ty, slidingTime);
}

/**
 * 从下往上滑动，曲线滑动,随机坐标
 */
function slidingByCurve() {
    // top X,Y范围
    tx = randomPointLoc(500, 600);
    ty = randomPointLoc(300, 400);
    // bottom X，Y 范围，确保 x 范围更靠近目标点的 x 坐标
    bx = randomPointLoc(tx - 100, tx + 100); // 范围向目标点的 x 坐标靠近
    by = randomPointLoc(device.height - 500, device.height - 200);

    log("☝action:\n" + bx + "," + by + ", " + tx + "," + ty + "")
    log("X: " + Math.abs(bx - tx) + " Y: " + Math.abs(by - ty));
    slidingTime = randomRangeTime(0.5, 1.1);
    sml_move(bx, by, tx, ty, slidingTime);
}


/////////////////////////////////////////////////////////////////////////////////////

function 全能点击(参数1, 参数2) {
    if (是否root == true) {
        Tap(参数1, 参数2)
    } else {
        click(参数1, 参数2)
    }
}
function aw找文(参数1, 参数2, 参数3) {
    var 我的
    if (参数3 < 1) {
        我的 = textContains(参数1).visibleToUser(true).findOne(600);
    } else {
        我的 = textContains(参数1).visibleToUser(true).findOne(参数3 * 1000);
    }
    if (我的 != null) {
        switch (true) {
            case 参数2 == 0:
                全能点击(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 1:
                log(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 2:
                return [我的.bounds().centerX(), 我的.bounds().centerY()];
            case 参数2 == 3:
                return 我的;
            default:
                var aw数据后 = 参数2.split(",");
                全能点击(我的.bounds().centerX() + (aw数据后[0] * 1), 我的.bounds().centerY() + (aw数据后[1] * 1));
                return true
        }
    } else {
        return false

    }
}
function aw匹配文(参数1, 参数2, 参数3) {
    var 我的
    if (参数3 < 1) {
        我的 = textMatches(参数1).visibleToUser(true).findOne(600);
    } else {
        我的 = textMatches(参数1).visibleToUser(true).findOne(参数3 * 1000);
    }
    if (我的 != null) {
        switch (true) {
            case 参数2 == 0:
                全能点击(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 1:
                log(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 2:
                return [我的.bounds().centerX(), 我的.bounds().centerY()];
            case 参数2 == 3:
                return 我的;
            default:
                var aw数据后 = 参数2.split(",");
                全能点击(我的.bounds().centerX() + (aw数据后[0] * 1), 我的.bounds().centerY() + (aw数据后[1] * 1));
                return true
        }
    } else {
        return false

    }
}
function aw找desc(参数1, 参数2, 参数3) {
    var 我的
    if (参数3 < 1) {
        我的 = descContains(参数1).visibleToUser(true).findOne(600);
    } else {
        我的 = descContains(参数1).visibleToUser(true).findOne(参数3 * 1000);
    }
    if (我的 != null) {
        switch (true) {
            case 参数2 == 0:
                全能点击(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 1:
                log(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 2:
                return [我的.bounds().centerX(), 我的.bounds().centerY()];
            case 参数2 == 3:
                return 我的;
            default:
                var aw数据后 = 参数2.split(",");
                全能点击(我的.bounds().centerX() + (aw数据后[0] * 1), 我的.bounds().centerY() + (aw数据后[1] * 1));
                return true
        }
    } else {
        return false;

    }
}


function aw找id(参数1, 参数2, 参数3) {
    var 我的
    if (参数3 < 1) {
        我的 = idContains(参数1).visibleToUser(true).findOne(600);
    } else {
        我的 = idContains(参数1).visibleToUser(true).findOne(参数3 * 1000);
    }
    if (我的 != null) {
        switch (true) {
            case 参数2 == 0:
                全能点击(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 1:
                log(我的.bounds().centerX(), 我的.bounds().centerY());
                return true
            case 参数2 == 2:
                return [我的.bounds().centerX(), 我的.bounds().centerY()];
            case 参数2 == 3:
                return 我的
            default:
                var aw数据后 = 参数2.split(",");
                全能点击(我的.bounds().centerX() + (aw数据后[0] * 1), 我的.bounds().centerY() + (aw数据后[1] * 1));
                return true
        }

    } else {
        return false
    }
}
function random(min, max) {
    return Math.random() * (max - min) + min;
}


//随机观看
function randomwatch(q, w) { //单位秒
    var watchTime = random(q, w);
    console.error("本次观看" + watchTime + "秒");
    sleep(watchTime * 1000);
}


////////////////////////////////////////////////////dump
var longUrl;
function dumpUser(userId) {
    if (userId.includes("http")) {
        var longUrl;
        // 导入必要的模块
        var HttpURLConnection = java.net.HttpURLConnection;
        var URL = java.net.URL;
        var InputStreamReader = java.io.InputStreamReader;
        var BufferedReader = java.io.BufferedReader;

        function expandUrl(shortUrl) {
            var url = new URL(shortUrl);
            var con = url.openConnection();
            con.setInstanceFollowRedirects(false);
            con.connect();
            var responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_MOVED_PERM || responseCode == HttpURLConnection.HTTP_MOVED_TEMP) {
                return con.getHeaderField("Location");
            }
            return shortUrl;
        }

        // 主函数
        function main() {
            var shortUrl = userId; // 替换为你的短链接地址
            try {
                longUrl = expandUrl(shortUrl);
                //console.log("Long URL: " + longUrl);
                return longUrl;
            } catch (e) {
                console.error(e);
            }
        }

        // 执行主函数
        main();


        // 要匹配的字符串
        var url = longUrl;

        // 定义正则表达式来匹配 shareObjectId 的值
        var regex = /shareObjectId=(\d+)/;

        // 使用正则表达式匹配
        var match = url.match(regex);

        // 如果匹配成功，则输出结果
        if (match) {
            var shareObjectId = match[1]; // 提取第一个捕获组的值
            //console.log("shareObjectId:", shareObjectId);
            //return shareObjectId;
            app.startActivity({
                action: "android.intent.action.VIEW",
                packageName: "com.ss.android.ugc.aweme",
                data: "kwai://profile/" + shareObjectId,
            });
        } else {
            console.log("shareObjectId not found in the URL.");
        }


    } else {
        app.startActivity({
            action: "android.intent.action.VIEW",
            packageName: "com.ss.android.ugc.aweme",
            data: "kwai://profile/" + userId,
            // data: "snssdk2329://user/profile/" + userId,
            // root: true
        });
    }
}

//////////////////////////////////////////////////dump
function dumpVideo(videoId) {
    app.startActivity({
        action: "android.intent.action.VIEW",
        packageName: "com.ss.android.ugc.aweme",
        data: "kwai://work/" + videoId,
        // data: "snssdk2329://user/profile/" + userId,
        // root: true
    });
}
function upslide() {
    var c = device.width;
    var b = device.height;
    log("⬆正在滑动向上滑动");
    swipe(c * 4 / 5, b / 10 * 7, c * 4 / 5, b / 10 * 3, 660);
};
function real_click(obj) {
    // for (let i = 1; i <= 3; i++) {
    //     if (obj) {
    //         if (obj.click()) { log("real click: true"); return true; }
    //         sleep(300);
    //     }
    // }
    // console.warn("控件无法正常点击：", obj);
    log("尝试再次点击");
    try {
        click(obj.bounds().centerX(), obj.bounds().centerY());
    } catch (error) {
    };
    return false;
};
function 计算概率(百分比) {
    // 生成一个 0 到 99 之间的随机数
    var 随机数 = random(0, 99);

    // 如果随机数小于等于给定的百分比，则返回 true，否则返回 false
    return 随机数 <= 百分比;
}


var 快手号 = "profile_user_kwai_id";
var 作品列表 = "recycler_view";
var 评论列表 = "recycler_view";
var 每一条评论 = "comment_frame";
var 评论按钮 = "comment_button";
var 评论数量 = "comment_count_view";
var 视频作者 = "user_name_text_view";
var 主页名字 = "user_name_tv";
var 评论 = "comment";
var 直播评论区 = "com.smile.gifmaker:id/live_comment_text_view";
var 直播间1 = "com.smile.gifmaker:id/live_comment_small_image_view";
var 直播间2 = "com.smile.gifmaker:id/live_bottom_bar_single_icon_container";
var 关注加 = "com.smile.gifmaker:id/slide_play_right_follow_button";
var 点赞爱心 = "com.smile.gifmaker:id/like_button";
//———————————————————————————↓ 参数设置区域 ↓ ——————————————————————————

var globle = storages.create("globle");
var 点赞概率 = globle.get("点赞概率");
var 关注概率 = globle.get("关注概率");
var 停留秒数min = globle.get("停留秒数min");
var 停留秒数max = globle.get("停留秒数max");
var 滑动视频数 = globle.get("滑动视频数");

//———————————————————————————↑ 参数设置区域 ↑ ——————————————————————————

var groupIndex = 0; // 用于跟踪组的索引
var groupsArray = []; // 用于存储每组元素的数组
var namearr = [];
var group = { element: [] };

var 是出来的 = false;
var 在主页 = 0;//0没有，1id主页，2目标主页
var 已进入主页视频 = 0;//0没进，1进了
var 目标 = [];
var 变动目标 = [];
var id名字 = "";

var 评论区到底了 = false;
var 目标对比 = [];
var 重复 = 1;
var 刚开 = 1;




var x = 0;
while (true) {
    sleep(1000)
    // if (刚开 == 1) {
    //     if (aw找id(快手号, 2, 0) && aw找id(作品列表, 2, 0)) {
    //         var 主页作品列表 = aw找id(作品列表, 3, 0);
    //         for (n = 0; n < 3; n++) {
    //             real_click(主页作品列表.child(0));
    //             if (aw找id(评论按钮, 2, 0) || aw找id(直播评论区, 2, 0) || aw找id(直播间1, 2, 0) || aw找id(直播间2, 2, 0)) {
    //                 log("已进入视频");
    //                 已进入主页视频 = 1;
    //                 刚开 = 0;
    //                 continue;
    //             };
    //         };
    //     }
    // } else {
    log("开始")
    有没有关注();
    sleep(500)
    有没有点赞();
    sleep(500);
    slidingByCurve();

    randomwatch(停留秒数min, 停留秒数max);
    // }
    if (x == 滑动视频数) {
        log("结束");
        home();
        break;
    }

}


function 有没有关注() {
    var yg = 0;
    while (true) {
        if (计算概率(关注概率)) {
            log("关注")
            sleep(2000)
            if (aw找id(关注加, 2, 3)) {
                log("未关注，关注……");
                var 关 = aw找id(关注加, 3, 0);
                real_click(关);
                yg = yg + 1;
                sleep(2000);
            } else {
                log("已关注")
                x = x + 1;
                break;
            }
            if (yg == 2) {
                break;
            }
        } else {
            break;
        }
    }
}

function 有没有点赞() {
    var yd = 0;
    if (aw找id(点赞爱心, 2, 3)) {
        while (true) {
            if (计算概率(点赞概率)) {
                log("点赞")
                sleep(2000)
                var 爱心 = aw找id(点赞爱心, 3, 0);
                if (爱心.selected() == true) {
                    log("已经点赞");
                    break;
                } else {
                    log("未点赞");
                    real_click(爱心);
                    yd = yd + 1;
                    if (yd == 2) {
                        break
                    } else { continue }
                }
            } else {
                log("跳过")
                break;
            }

        }
    } else {
        log("next");
    }

}

